Busan, formerly romanized as Pusan and now officially Busan Metropolitan City, is South Korea's second-most populous city after Seoul, with a population of over 3.5 million inhabitants.[3] It is the economic, cultural and educational center of southeastern South Korea, with its port—Korea's busiest and the fifth-busiest in the world [a]—only about 190 kilometers (120 mi) from the Japanese islands of Kyushu and Honshu. The surrounding "Southeast Economic Zone" (including Ulsan and South Gyeongsang) is South Korea's largest industrial area.
However, Busan is a city unknown to foreigners yet. So, I wolud like to provide useful materials for tourists who want to travel to new cities in Korea or for business travelers.

I used following data for this project.
Administrative divisions
Datasource: https://en.wikipedia.org/wiki/Busan
Description: Administrative divisions Table with 16 subdivisions and population of each district
Map data of Busan:
Data source: http://www.gisdeveloper.co.kr/?p=2332
Description : Shapefile of South Korea to extract the geojson of Busan
Venues in each subdivision of Busan:
Data source: Foursquare APIs
Description: All the venues in each subdivision
Scrap data from wikidipia
First of all, I scraped data from Wikipedia to create a dataframe with the city districts of Busan.
https://en.wikipedia.org/wiki/Busan
and, transformed the data into a dataframe containing name of the 16 subdivisions, Area and population.
busan_data
Nest step was to get the shapefile (SHP) of South Korea and extract the geojson of Busan by using QGIS 3 (https://www.qgis.org/)
Left: Entire Soth Korea
Right: After filtering out

Then, I used the geopands to transform geojson into geodataframe.
This geodataframe and the dataframre from wikidipia are merged into one geodataframe.
The geodataframe contains geometry data for each subdivision.
busan_data
Using the folium package and the geodataframe, I then created a map of the 16 subdivisions with population.
busan_map = build_map(busan_data, 'default')
tooltip = build_tooltip(busan_map, busan_data, ['Subdivision', 'Population'], ['Subdivision: ','Population: '])
busan_map
At Last, I used each subdivision name for foursquare API to get all of venues in Busan and 464 venues were returned
The quary string is:
e.g) near="수영구, 부산광역시, 대한민국"
busan_venues = getNearbyVenues(subdivision=busan_data['Subdivision'],
korean=busan_data['Korean'])
print(busan_venues.shape)
busan_venues.head()
I plotted a bar chart with the top 10 highest number of venues in the whole city. We can see that Coffee shop, Korean Restaurant and Fast Food Restaurant are the top 3 within 84 unique venues in Busan.
venues = busan_venues.groupby('Venue Category').count().sort_values(by='Venue', ascending=False).head(10)
venues.plot.bar(y="Venue", use_index=True, rot=70, title="Top 10 highest number of venues in Busan", figsize=(15,5));
print('There are {} uniques categories.'.format(len(busan_venues['Venue Category'].unique())))
To find clusters of city districts, I create a data-frame with pandas one hot encoding for the venue categories.
print(busan_onehot.shape)
busan_onehot.head()
I used this information to create a data frame in which you can see the most common restaurant venue types for each city district.
subdivision_venues_sorted
I used prescriptive analytics to help a traveler decide a location to visit. I will use clustering (KMeans).
Data is normalized with StandardScaler and Silhouette Method helps find out the opitmal K.
The optimal K is 4
busan_grouped_clustering = busan_grouped.drop('Subdivision', 1)
Clus_dataSet = StandardScaler().fit_transform(busan_grouped_clustering)
distortion = []
for k in range(2, 6):
kmeans = KMeans(n_clusters = k).fit(Clus_dataSet)
predict = kmeans.fit_predict(Clus_dataSet)
distortion.append(silhouette_score(Clus_dataSet, predict, metric = 'euclidean'))
plt.plot(range(2, 6), distortion)
plt.title('Silhouette Method')
plt.xlabel('Number of clusters')
plt.show()
Here is the result of K-mean clustring with the K value.
What we see in the table are the city districts and their most common venues, and they now have been assigned 4 different cluster labels.
As a result, the Coffee Shop and Korean Restaurant can be found all over Busan.
busan_merged.head()
Cluster 0 - Hotels and Markets are the common venues in this districts (except Coffee Shop and Korean Restaurant)
busan_merged.loc[busan_merged['Cluster Labels'] == 0, busan_merged.columns[[0] + list(range(5, busan_merged.shape[1]))]]
Cluster 1 - Supermarket and Fast Food Restaurant are the common venues in this districts (except Coffee Shop and Korean Restaurant)
busan_merged.loc[busan_merged['Cluster Labels'] == 1, busan_merged.columns[[0] + list(range(5, busan_merged.shape[1]))]]
Cluster 2 - Beach and Scenic Lookout are the common venues in this districts (except Coffee Shop and Korean Restaurant)
busan_merged.loc[busan_merged['Cluster Labels'] == 2, busan_merged.columns[[0] + list(range(5, busan_merged.shape[1]))]]
Cluster 3 - Seafood Restaurant and Golf Course are the common venues in this districts (except Coffee Shop and Korean Restaurant)
busan_merged.loc[busan_merged['Cluster Labels'] == 3, busan_merged.columns[[0] + list(range(5, busan_merged.shape[1]))]]
This map shows the city districts with a cluster-specific color and markers of each venues.
busan_map